"""
JWT Token 过期时间配置检查脚本
用于验证 JWT_ACCESS_TOKEN_EXPIRE_MINUTES 配置是否正确设置为 24 小时（1440 分钟）
"""

import os
import sys
from pathlib import Path

# 设置控制台编码为 UTF-8（Windows）
if sys.platform == 'win32':
    import io
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')

def check_env_file():
    """检查 .env 文件是否存在"""
    env_path = Path(__file__).parent / ".env"
    if not env_path.exists():
        print("❌ 错误: .env 文件不存在")
        print(f"   请创建 {env_path}")
        return False, None
    print(f"✅ .env 文件存在: {env_path}")
    return True, env_path

def check_jwt_config_in_env(env_path: Path):
    """检查 .env 文件中的 JWT 配置"""
    try:
        # 尝试多种编码
        encodings = ['utf-8', 'gbk', 'gb2312', 'latin-1']
        content = None
        for encoding in encodings:
            try:
                with open(env_path, 'r', encoding=encoding) as f:
                    content = f.read()
                break
            except UnicodeDecodeError:
                continue
        
        if content is None:
            print(f"❌ 无法读取 .env 文件（编码问题）")
            return None, None
        
        lines = content.split('\n')
        jwt_expire_minutes = None
        jwt_expire_days = None
        
        for line in lines:
            line = line.strip()
            # 跳过注释和空行
            if not line or line.startswith('#'):
                continue
            
            # 查找 JWT_ACCESS_TOKEN_EXPIRE_MINUTES
            if line.startswith('JWT_ACCESS_TOKEN_EXPIRE_MINUTES'):
                parts = line.split('=', 1)
                if len(parts) == 2:
                    jwt_expire_minutes = int(parts[1].strip())
            
            # 查找 JWT_REFRESH_TOKEN_EXPIRE_DAYS
            if line.startswith('JWT_REFRESH_TOKEN_EXPIRE_DAYS'):
                parts = line.split('=', 1)
                if len(parts) == 2:
                    jwt_expire_days = int(parts[1].strip())
        
        return jwt_expire_minutes, jwt_expire_days
    except Exception as e:
        print(f"❌ 读取 .env 文件失败: {e}")
        return None, None

def check_settings_config():
    """检查 settings 中实际加载的 JWT 配置"""
    try:
        # 尝试加载 dotenv
        try:
            from dotenv import load_dotenv
            env_path = Path(__file__).parent / ".env"
            if env_path.exists():
                load_dotenv(env_path)
        except ImportError:
            pass
        
        from app.core.config import settings
        
        access_token_expire = settings.JWT_ACCESS_TOKEN_EXPIRE_MINUTES
        refresh_token_expire = settings.JWT_REFRESH_TOKEN_EXPIRE_DAYS
        
        return access_token_expire, refresh_token_expire
    except Exception as e:
        print(f"❌ 加载 settings 配置失败: {e}")
        import traceback
        traceback.print_exc()
        return None, None

def format_time(minutes: int) -> str:
    """格式化时间显示"""
    if minutes < 60:
        return f"{minutes} 分钟"
    elif minutes < 1440:
        hours = minutes // 60
        remaining_minutes = minutes % 60
        if remaining_minutes == 0:
            return f"{hours} 小时"
        else:
            return f"{hours} 小时 {remaining_minutes} 分钟"
    else:
        days = minutes // 1440
        remaining_hours = (minutes % 1440) // 60
        if remaining_hours == 0:
            return f"{days} 天"
        else:
            return f"{days} 天 {remaining_hours} 小时"

def main():
    """主函数"""
    print("=" * 60)
    print("JWT Token 过期时间配置检查")
    print("=" * 60)
    
    # 1. 检查 .env 文件
    print("\n1️⃣ 检查 .env 文件")
    env_exists, env_path = check_env_file()
    if not env_exists:
        sys.exit(1)
    
    # 2. 检查 .env 文件中的配置
    print("\n2️⃣ 检查 .env 文件中的 JWT 配置")
    env_access_token, env_refresh_token = check_jwt_config_in_env(env_path)
    
    if env_access_token is None:
        print("❌ JWT_ACCESS_TOKEN_EXPIRE_MINUTES 未在 .env 文件中找到")
        print("   请在 .env 文件中添加：")
        print("   JWT_ACCESS_TOKEN_EXPIRE_MINUTES=1440  # 24小时 = 1440分钟")
    else:
        print(f"   JWT_ACCESS_TOKEN_EXPIRE_MINUTES={env_access_token} ({format_time(env_access_token)})")
        if env_access_token == 1440:
            print("   ✅ Access Token 过期时间已正确设置为 24 小时（1440 分钟）")
        elif env_access_token < 1440:
            print(f"   ⚠️  Access Token 过期时间 ({format_time(env_access_token)}) 小于 24 小时")
            print("   建议修改为：JWT_ACCESS_TOKEN_EXPIRE_MINUTES=1440")
        else:
            print(f"   ⚠️  Access Token 过期时间 ({format_time(env_access_token)}) 大于 24 小时")
    
    if env_refresh_token is None:
        print("   ⚠️  JWT_REFRESH_TOKEN_EXPIRE_DAYS 未在 .env 文件中找到")
        print("   （此配置有默认值，可以不设置）")
    else:
        print(f"   JWT_REFRESH_TOKEN_EXPIRE_DAYS={env_refresh_token} 天")
    
    # 3. 检查实际加载的配置
    print("\n3️⃣ 检查实际加载的 JWT 配置")
    settings_access_token, settings_refresh_token = check_settings_config()
    
    if settings_access_token is None:
        print("❌ 无法加载 settings 配置")
        print("   请检查后端服务是否正常运行，以及 .env 文件配置是否正确")
    else:
        print(f"   JWT_ACCESS_TOKEN_EXPIRE_MINUTES={settings_access_token} ({format_time(settings_access_token)})")
        if settings_access_token == 1440:
            print("   ✅ Access Token 过期时间已正确设置为 24 小时（1440 分钟）")
        else:
            print(f"   ❌ Access Token 过期时间 ({format_time(settings_access_token)}) 不是 24 小时")
            print("   ⚠️  配置未生效！请检查：")
            print("      1. .env 文件中的 JWT_ACCESS_TOKEN_EXPIRE_MINUTES 是否设置为 1440")
            print("      2. 是否重启了后端服务（修改 .env 文件后必须重启服务才能生效）")
            print("      3. 是否有其他地方覆盖了这个配置值")
        
        if settings_refresh_token is not None:
            print(f"   JWT_REFRESH_TOKEN_EXPIRE_DAYS={settings_refresh_token} 天")
    
    # 4. 对比配置
    print("\n4️⃣ 配置对比")
    if env_access_token is not None and settings_access_token is not None:
        if env_access_token == settings_access_token:
            print("   ✅ .env 文件配置与实际加载配置一致")
        else:
            print(f"   ❌ 配置不一致！")
            print(f"      .env 文件: {env_access_token} 分钟")
            print(f"      实际加载: {settings_access_token} 分钟")
            print("   ⚠️  请重启后端服务以使 .env 文件的更改生效")
    
    # 5. 注意事项
    print("\n5️⃣ 重要提示")
    print("   • 已存在的 token 不受新配置影响，只有新登录或刷新 token 才会使用新配置")
    print("   • 修改 .env 文件后，必须重启后端服务才能生效")
    print("   • 用户需要重新登录才能获取使用新过期时间的 token")
    print("   • 或者使用刷新 token 功能，刷新后的 token 会使用新的过期时间")
    
    # 总结
    print("\n" + "=" * 60)
    print("检查总结")
    print("=" * 60)
    
    all_ok = True
    if env_access_token is None:
        print("❌ .env 文件中缺少 JWT_ACCESS_TOKEN_EXPIRE_MINUTES 配置")
        all_ok = False
    elif env_access_token != 1440:
        print(f"⚠️  .env 文件中的 JWT_ACCESS_TOKEN_EXPIRE_MINUTES 不是 1440（当前: {env_access_token}）")
        all_ok = False
    
    if settings_access_token is None:
        print("❌ 无法验证实际加载的配置")
        all_ok = False
    elif settings_access_token != 1440:
        print(f"❌ 实际加载的 JWT_ACCESS_TOKEN_EXPIRE_MINUTES 不是 1440（当前: {settings_access_token}）")
        print("   请重启后端服务以使配置生效")
        all_ok = False
    elif env_access_token == settings_access_token == 1440:
        print("✅ JWT Access Token 过期时间已正确配置为 24 小时（1440 分钟）")
        print("   ✅ 配置已正确加载")
    
    if all_ok:
        print("\n✅ 配置检查通过！")
    else:
        print("\n⚠️  配置检查发现问题，请根据上述提示进行修复")
        sys.exit(1)

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\n\n中断检查")
        sys.exit(0)
    except Exception as e:
        print(f"\n❌ 检查过程出错: {e}")
        import traceback
        traceback.print_exc()
        sys.exit(1)

